package com.gsdl.web.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import com.gsdl.model.delegate.BusinessDelegate;
import com.gsdl.model.entity.Centro;
import com.gsdl.model.entity.Deposito;
import com.gsdl.model.entity.Entrada;
import com.gsdl.model.entity.Material;
import com.gsdl.model.entity.Movimento;
import com.gsdl.model.entity.Pedido;
import com.gsdl.model.entity.Pedido.EstadoPedido;
import com.gsdl.model.entity.Stock;


// TODO: Auto-generated Javadoc
/**
 * The Class RelatorioController.
 *
 * @author Natacha Antonopoulos
 */

@ManagedBean
@ViewScoped
public class RelatorioController implements Serializable{

	/** The Constant serialVersionUID. */
	private static final long serialVersionUID = -5436053918514090191L;
	
	/** The pedidos. */
	private List<Pedido> pedidos = new ArrayList<Pedido>();
	
	/** The movimentos. */
	private List<Movimento> movimentos = new ArrayList<Movimento>();
	
	/** The stocklist. */
	private List<Stock> stocklist = new ArrayList<Stock>();
	
	/** The entradas. */
	private List<Entrada> entradas = new ArrayList<Entrada>();
	
	/** The date. */
	private Date date = new Date();
	
	/** The centro. */
	private Centro centro = new Centro();
	
	/** The material. */
	private Material material = new Material();
	
	/** The deposito. */
	private Deposito deposito = new Deposito();
	
	/** The estado pedido. */
	private EstadoPedido estadoPedido = null;
	
	/**
	 * Go to stock.
	 *
	 * @return the string
	 */
	public String goToStock(){
		stocklist = new ArrayList<Stock>();
		return "relatorioStock";
	}
	
	/**
	 * Go to entradas.
	 *
	 * @return the string
	 */
	public String goToEntradas(){
		entradas = new ArrayList<Entrada>();
		return "relatorioEntradas";
	}
	
	/**
	 * Go to movimentos.
	 *
	 * @return the string
	 */
	public String goToMovimentos(){
		movimentos = new ArrayList<Movimento>();
		return "relatorioMovimentos";
	}
	
	/**
	 * Go to pedidos.
	 *
	 * @return the string
	 */
	public String goToPedidos(){
		pedidos = new ArrayList<Pedido>();
		return "relatorioPedidos";
	}
	
	/**
	 * Gets the pedidos filtered by centro/estadoPedido.
	 *
	 * @return the pedidos
	 */
	public List<Pedido> getPedidos() {
		
		if(centro != null && centro.getId() != null && centro.getId() != 0L && estadoPedido != null)
			pedidos = BusinessDelegate.getInstance().getPedidosByCentroAndEstado(centro, estadoPedido);
		else if(centro != null && centro.getId() != null && centro.getId() != 0L)
			pedidos = BusinessDelegate.getInstance().getPedidosByCentro(centro);
		else if(estadoPedido != null)
			pedidos = BusinessDelegate.getInstance().getPedidosByEstado(estadoPedido);
		else
			pedidos = BusinessDelegate.getInstance().getAllPedidos();
		return pedidos;
	}
	
	/**
	 * Sets the pedidos.
	 *
	 * @param pedidos the pedidos to set
	 */
	public void setPedidos(List<Pedido> pedidos) {
		this.pedidos = pedidos;
	}
	
	/**
	 * Gets the movimentos filtered by deposito/material
	 *
	 * @return the movimentos
	 */
	public List<Movimento> getMovimentos() {
		
		if(deposito != null && deposito.getId() != null && deposito.getId() != 0L && material != null && material.getId() != null && material.getId() != 0L)
			movimentos = BusinessDelegate.getInstance().getMovimentosByDepositoAndMaterial(deposito, material);
		else if(deposito != null && deposito.getId() != null && deposito.getId() != 0L )
			movimentos = BusinessDelegate.getInstance().getMovimentosByDeposito(deposito);
		else if(material != null && material.getId() != null && material.getId() != 0L )
			movimentos = BusinessDelegate.getInstance().getMovimentosByMaterial(material);
		else
			movimentos = BusinessDelegate.getInstance().getAllMovimentos();
		return movimentos;
	}
	
	/**
	 * Sets the movimentos.
	 *
	 * @param movimentos the movimentos to set
	 */
	public void setMovimentos(List<Movimento> movimentos) {
		this.movimentos = movimentos;
	}
	
	
	/**
	 * Gets the stocklist filtered by deposito/material
	 *
	 * @return the stocklist
	 */
	public List<Stock> getStocklist() {
		if(deposito != null && deposito.getId() != null && deposito.getId() != 0L && material != null && material.getId() != null && material.getId() != 0L)
			stocklist = BusinessDelegate.getInstance().getStockByDepositoAndMaterial(deposito, material);
		else if(deposito != null && deposito.getId() != null && deposito.getId() != 0L)
			stocklist = BusinessDelegate.getInstance().getStockDeposito(deposito);
		else if(material != null && material.getId() != null && material.getId() != 0L)
			stocklist = BusinessDelegate.getInstance().getStockMaterial(material);
		else
			stocklist = BusinessDelegate.getInstance().getStockList();
		
		return stocklist;
	}
	
	/**
	 * Gets the estados pedido.
	 *
	 * @return the estados pedido
	 */
	public EstadoPedido[] getEstadosPedido() {
		return EstadoPedido.values();
	}
	
	/**
	 * Sets the stocklist.
	 *
	 * @param stocklist the stocklist to set
	 */
	public void setStocklist(List<Stock> stocklist) {
		this.stocklist = stocklist;
	}
	
	/**
	 * Gets the date.
	 *
	 * @return the date
	 */
	public Date getDate() {
		return date;
	}
	
	/**
	 * Sets the date.
	 *
	 * @param date the date to set
	 */
	public void setDate(Date date) {
		this.date = date;
	}
	
	/**
	 * Gets the centro.
	 *
	 * @return the centro
	 */
	public Centro getCentro() {
		return centro;
	}
	
	/**
	 * Sets the centro.
	 *
	 * @param centro the centro to set
	 */
	public void setCentro(Centro centro) {
		this.centro = centro;
	}
	
	/**
	 * Gets the material.
	 *
	 * @return the material
	 */
	public Material getMaterial() {
		return material;
	}
	
	/**
	 * Sets the material.
	 *
	 * @param material the material to set
	 */
	public void setMaterial(Material material) {
		this.material = material;
	}

	/**
	 * Gets the deposito.
	 *
	 * @return the deposito
	 */
	public Deposito getDeposito() {
		return deposito;
	}

	/**
	 * Sets the deposito.
	 *
	 * @param deposito the deposito to set
	 */
	public void setDeposito(Deposito deposito) {
		this.deposito = deposito;
	}

	/**
	 * Gets the estado pedido.
	 *
	 * @return the estadoPedido
	 */
	public EstadoPedido getEstadoPedido() {
		return estadoPedido;
	}

	/**
	 * Sets the estado pedido.
	 *
	 * @param estadoPedido the estadoPedido to set
	 */
	public void setEstadoPedido(EstadoPedido estadoPedido) {
		this.estadoPedido = estadoPedido;
	}

	/**
	 * Gets the entradas filtered by centro/deposito.
	 *
	 * @return the entradas
	 */
	public List<Entrada> getEntradas() {
		if(centro != null && centro.getId() != null && centro.getId() != 0L && deposito != null && deposito.getId() != null && deposito.getId() != 0L)
			entradas = BusinessDelegate.getInstance().getEntradasByCentroAndDeposito(centro, deposito);
		else if(centro != null && centro.getId() != null && centro.getId() != 0L)
			entradas = BusinessDelegate.getInstance().getEntradasByCentro(centro);
		else
			entradas = BusinessDelegate.getInstance().getEntradas();
		
		return entradas;
	}

	/**
	 * Sets the entradas.
	 *
	 * @param entradas the entradas to set
	 */
	public void setEntradas(List<Entrada> entradas) {
		this.entradas = entradas;
	}
	
	/**
	 * Gets the centro depositos armazenamento.
	 *
	 * @return the centro depositos armazenamento
	 */
	public List<Deposito> getCentroDepositosArmazenamento() {
		if(centro == null || centro.getId() == null)
			return new ArrayList<Deposito>(); 

		return BusinessDelegate.getInstance().getDepositoArmazenamentoByCentro(centro);
	}
}
